﻿/**
 * 
 * @file   OperActionSpectrogramResult.h
 * @brief  后处理云图操作器
 * @author TanDongYang (tandongyang@diso.cn)
 * @date   2024-11-25
 * 
 */

#ifndef OPERACTIONSPECTROGRAMRESULT_H
#define OPERACTIONSPECTROGRAMRESULT_H

#include "FITK_Kernel/FITKCore/FITKActionOperator.h"
#include "FITK_Kernel/FITKCore/FITKOperatorRepo.h"

namespace GUI
{
    class GUIContourPlotDialog;
    class PreWindow3D;
}

namespace Acoustics
{
    class FITKAbstractSEASubSys;
    class FITKAcousticsPostData;
    class FITKAcousticsHDF5DataSet;
    class FITKAcousticsContourPlotData;
    class FITKAcousticsHDF5DataSetManager;
}

namespace GUIOper
{
    /**
     * @brief   后处理云图操作器
     * @author  TanDongYang (tandongyang@diso.cn)
     * @date    2024-11-25 
     */
    class OperActionSpectrogramResult :public Core::FITKActionOperator
    {
        Q_OBJECT;

    public:
        /**
         * @brief   Construct a new OperActionSpectrogramResult object
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-25 
         */
        explicit OperActionSpectrogramResult() = default;

        /**
         * @brief   Destroy the OperActionSpectrogramResult object
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-25 
         */
        virtual ~OperActionSpectrogramResult() = default;

        /**
         * @brief 执行
         * @return true 成功
         * @return false 失败
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-25 
         */
        virtual bool execGUI() override;

        /**
         * @brief 执行结果处理
         * @return true 成功
         * @return false 失败
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-25 
         */
        virtual bool execProfession() override;

    protected:
        
        /**
         * @brief   获取频率数据
         * @param[i]   postData 后处理数据对象
         * @return      频率数据集
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-25 
         */
        std::vector<float> getFrequenciesData(Acoustics::FITKAcousticsPostData* postData);

        /**
         * @brief   获取工况载荷
         * @param[i]   postData 后处理数据对象
         * @return  工况载荷名称集
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-25 
         */
        QStringList getLoadCases(Acoustics::FITKAcousticsPostData* postData);

        /**
         * @brief       获取子系统对象根据云图显示类型
         * @param[i]   engUnitsType 云图显示类型
         * @return      子系统数据集
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        QList<Acoustics::FITKAbstractSEASubSys*> getSEASubSysByType(Acoustics::FITKAcousticsContourPlotData*);

        /**
         * @brief   获取后处理云图参数数据对象
         * @return  参数数据对象
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        Acoustics::FITKAcousticsContourPlotData* getContourPlotData();

        /**
         * @brief   获取当前显示窗体的名称
         * @return  
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        QString getWidgetName();

        /**
         * @brief   获取当前激活的显示窗体
         * @return  
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        GUI::PreWindow3D* getPerWindow3D();

        /**
         * @brief       根据界面参数设置获取原始数据
         * @return      原始数据
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        QHash<QString, float> getRawDatas();

        /**
         * @brief   对数据进行平方后相加再开方
         * @param[i]   list 数据集
         * @return     返回计算结果
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        float mathSumValue(QList<float> list);

        /**
         * @brief   获取数据根据设定参数
         * @param[i]   plotData 参数设定对象
         * @param[i]   dataSetManager   数据集管理器
         * @param[i]   subSysItem   子系统对象
         * @return      返回数值
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        float getValueBySetting(
            Acoustics::FITKAcousticsContourPlotData* plotData, 
            Acoustics::FITKAcousticsHDF5DataSetManager* dataSetManager,
            Acoustics::FITKAbstractSEASubSys* subSysItem);

        /**
         * @brief      获取数据根据声腔提取逻辑
         * @param[i]   plotData     参数设定对象
         * @param[i]   dataSetManager   数据集管理器
         * @return  返回数值
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        float getValueFromSEACavity(
            Acoustics::FITKAcousticsContourPlotData* plotData,
            Acoustics::FITKAcousticsHDF5DataSetManager* dataSetManager);

        /**
         * @brief   获取数据根据板或壳提取逻辑
         * @param[i]   plotData 参数设定对象
         * @param[i]   dataSetManager   数据集管理器
         * @param[i]   subItemName  子系统对象名称
         * @return  返回数值
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        float getValueFromSEAPlateOrShell(
            Acoustics::FITKAcousticsContourPlotData* plotData,
            Acoustics::FITKAcousticsHDF5DataSetManager* dataSetManager, 
            QString subItemName);

        /**
         * @brief   获取数据根据梁提取逻辑
         * @param[i]   plotData 参数设定对象
         * @param[i]   dataSetManager   数据集管理器
         * @param[i]   subItemName  子系统对象名称
         * @return      返回数值
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        float getValueFromSEABeam(
            Acoustics::FITKAcousticsContourPlotData* plotData,
            Acoustics::FITKAcousticsHDF5DataSetManager* dataSetManager,
            QString subItemName);

        /**
         * @brief   获取数据集合根据数据集列表和频率值索引
         * @param[i]   listDataSet  数据集列表
         * @param[i]   hzIndex  频率值索引
         * @return      数据集合
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        QList<float> getValueByDataSetList(QList<Acoustics::FITKAcousticsHDF5DataSet*> listDataSet, int hzIndex);

        /**
         * @brief   根据界面
         * @param[i]   
         * @param[i]   plotData
         * @return  
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        QHash<QString, float> mathValueByPlotSetting(QHash<QString, float>, Acoustics::FITKAcousticsContourPlotData* plotData);

        /**
         * @brief   创建色棒标题
         * @return  
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        QString createBarName();

        /**
         * @brief   更新比例数值
         * @param[i]   plotData 后处理数据对象
         * @param[i]   dlg 当前参数界面
         * @param[o]   fMin 计算的最小值
         * @param[o]   fMax 计算的最大值
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-28 
         */
        void updateScaleData(Acoustics::FITKAcousticsContourPlotData* plotData,GUI::GUIContourPlotDialog* dlg, float& fMin, float fMax);

        /**
         * @brief   判断是否使用Log显示模式
         * @param[i]   plotData 数据对象    
         * @return  是否使用Log模式
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-28 
         */
        bool isUseLogSetting(Acoustics::FITKAcousticsContourPlotData* plotData);

    protected slots:
        ;
        /**
         * @brief   界面窗口应用响应槽
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-26 
         */
        void dialogAccepted_Slot();

    };

    // 按钮注册相关操作
    //Register2FITKOperatorRepo(actionSpectrogramResult, OperActionSpectrogramResult);

}

#endif // OPERACTIONSPECTROGRAMRESULT_H
